package lincen.javame.game.tetris;

import lincen.javame.game.tetris.pieces.Tetris;

/**
 * 矩形堆
 * 当方块落到堆上的时候静止
 * 随之, 此方块就转化为堆的一部分
 * 当堆的高度大于Matrix的高度的时候 , 游戏结束
 * 当堆的某一行被填满的时候, 清除这一行
 * @author 林岑
 */
public class Stack {

	/**
	 * 标记堆中的某个位置是否有块
	 */
	private boolean [] [] point;

	/**
	 * 列, 行
	 */
	private int col, row;

	/**
	 * 新建一个宽度为width, 高度为height的堆
	 * 初始化的时候为一个空堆
	 * @param col
	 * @param row
	 */
	public Stack(int col, int row) {
		this.col = col;
		this.row = row;
		this.point = new boolean [row] [col];
//		testInit(row, col);
	}

	/**
	 * 该方法为了测试程序运行结果而写
	 */
//	private void testInit(int width, int height) {
//		// TODO Auto-generated method stub
//		for (int x = 0; x < height; x++) {
//			for (int y = 0; y < width; y++) {
//				if(y > 17 && (x + y) % 2 == 0) {
//					this.point[y][x] = true;
//				}
//			}
//		}
//
//		for (int i = 0; i < this.getCol() - 1; i++) {
//			this.point[10][i] = true;
//		}
//	}

	/**
	 * 获得点阵
	 * @return
	 */
	public boolean [] [] getPoints() {
		return this.point;
	}

	/**
	 * 将t追加到堆中
	 * @param t
	 */
	public void append(Tetris t) {
		boolean [] [] p = t.getPoint();
		for (int y = 0; y < p.length; y++) {
			for (int x = 0; x < p[0].length; x++) {
				if(p[y][x]) {
					if(
							y + t.getDy() >= 0 && y + t.getDy() < this.getRow() &&
							x + t.getDx() >= 0 && x + t.getDx() < this.getCol()
					) {
						this.point[y + t.getDy()][x + t.getDx()] = p[y][x];
					}
				}
			}
		}
	}

	/**
	 * 获得堆列数
	 * @return
	 */
	public int getCol() {
		return col;
	}

	/**
	 * 获得堆的行数
	 * @return
	 */
	public int getRow() {
		return row;
	}


	/**
	 * 删除满的单行
	 * 如果此行不满,就不删
	 * @param row
	 * 返回是否删除某行
	 */
	public boolean deleteLine(int row) {
		boolean [] [] point = this.getPoints();
		boolean isFull = true;
		for (int x = 0; x < this.getCol(); x++) {
			if(!point[row][x]) {
				isFull = false;
				break;
			}
		}

		if (isFull) {
			this.upToDown(row);
		}
		return isFull;
	}

	/**
	 * 统计stack中点的数量
	 * @return
	 */
	public int size() {
		int size = 0;
		for (int y = 0; y < this.getRow(); y++) {
			for (int x = 0; x < this.getCol(); x++) {
				if(this.point[y][x]) {
					size ++;
				}
			}
		}
		return size;
	}
	
	/**
	 * 删除当前行, 并
	 * 将第row行以上的元素
	 * 全部向下移动一个单位
	 * @param row
	 */
	private void upToDown(int row) {
		while(row > 0) {
			cover(row - 1, row);
			row--;
		}
	}

	/**
	 * 将第row1行元素移动到row2行, 覆盖row2行元素, 最后删除第row行元素
	 * @param row1
	 * @param row2
	 */
	private void cover(int row1, int row2) {
		for (int x = 0; x < this.getCol(); x++) {
			this.point[row2][x] = this.point[row1][x];
			this.point[row1][x] = false;
		}
	}

}
